home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Inside Mac Games Volume 5 #3
/
IMG 46 Vol 5-3.iso
/
More Goodies
/
More For Your Game
/
Realmz
/
Character Master Source
/
Character Master
/
main.cpp
< prev
next >
Wrap
Text File
|
1996-07-16
|
11KB
|
468 lines
//•••••••••••••••••••••••••••••••••••••••
//• Character editor for Realmz •
//• Written by David Wagner •
//•••••••••••••••••••••••••••••••••••••••
#include "main.h" // Constants. prototypes and includes.
#include "my menus.h"
#include "my AppleEvents.h"
#include "character class.h"
#include "my files.h"
nemesisGlobalPtr G; // The global class which includes all sorts of useful stuff
void StartupHook()
{
OSErr error = noErr;
long temp;
if( !G->HasColourQD() )
{
NemesisShowError( kBadSystemError, kMortalError );
}
G->SetCreator( 'ÇhM§' );
G->SetAppData( ((long)new CMGlobal) );
CMData()->SetRealmzAppFileFilter( NewFileFilterYDProc( MyRealmzAppFileFilter ) );
CMData()->SetRealmzCharFileFilter( NewFileFilterYDProc( MyRealmzCharFileFilter ) );
CMData()->SetRealmzAppDialogHook( NewDlgHookYDProc( MyRealmzAppDialogHook ) );
CMData()->SetRealmzCharDialogHook( NewDlgHookYDProc( MyRealmzCharDialogHook ) );
CMData()->SetGetFileModalFilter( NewModalFilterYDProc( MyGetFileModalFilter ) );
CMData()->LoadPrefs();
if( CMData()->KnowWhereRealmzIs() )
DoReadRealmzData();
}
void ShutdownHook()
{
CMData()->SavePrefs();
}
CMGlobalPtr CMData()
{
return ( (CMGlobalPtr)G->AppData() );
}
OSErr InstallAEHandlersHook()
{
OSErr error;
// install open application handler
error = AEInstallEventHandler(kCoreEventClass, kAEOpenApplication,
NewAEEventHandlerProc(HandleOAppAE), 0, false);
if (error)
{
return error;
}
// install quit application handler
error = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication,
NewAEEventHandlerProc(HandleQuitAE), 0, false);
if (error)
{
return error;
}
// install open document handler
error = AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments,
NewAEEventHandlerProc(HandleODocAE), 0, false);
if (error)
{
return error;
}
// install print document handler
error = AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments,
NewAEEventHandlerProc(HandlePDocAE), 0, false);
return error;
}
void HandleEventHook( EventRecord *theEvent )
{
NemesisHandleEvent( theEvent );
}
void MouseDownEventHook( EventRecord *theEvent )
{
NemesisMouseDown( theEvent );
}
void MouseMovedHook( EventRecord *theEvent )
{
};
void KeyDownEventHook( EventRecord *theEvent )
{
NemesisKeyDown( theEvent );
}
void NullEventHook()
{
NemesisNullEvent();
}
void CMGlobal::SetCurrentType( short theType )
{
currentType = theType;
switch( currentType )
{
case kAllClasses : typeToShow = 0;
showAll = true;
break;
case kFighterClass : typeToShow = kFighterType;
showAll = false;
break;
case kMonkClass : typeToShow = kMonkType;
showAll = false;
break;
case kPaladinClass : typeToShow = kPaladinType;
showAll = false;
break;
case kRangerClass : typeToShow = kRangerType;
showAll = false;
break;
case kThiefClass : typeToShow = kThiefType;
showAll = false;
break;
case kMagicClass : typeToShow = kMagicType;
showAll = false;
break;
case kClericClass : typeToShow = kClericType;
showAll = false;
break;
case kEnchanterClass: typeToShow = kEnchanterType;
showAll = false;
break;
default : typeToShow = 0;
showAll = true;
break;
}
}
void CMGlobal::InitSpellStuff()
{
int count1, count2, count3;
for( count1 = 0; count1 < 3; count1++ )
{
for( count2 = 0; count2 < 7; count2++ )
{
for( count3 = 0; count3 < 12; count3++ )
{
spellName[count1][count2][count3][0] = 0;
spellDescription[count1][count2][count3][0] = 0;
}
}
}
};
void CMGlobal::SetSpellName( int spellType, int spellLevel, int spell, Str255 theSpellName )
{
Str255 tempStr;
Boolean unknownSpell = false;
NemesisPStrCpy( tempStr, "\p«Error passing to CMGlobal::SetSpellName»" );
// Error checking
if( (spellType < kClericSpellList) || (spellType > kEnchanterSpellList) )
unknownSpell = true;
if( (spellLevel < 0) || (spellLevel > 6) )
unknownSpell = true;
if( (spell < 0) || (spell > 11) )
unknownSpell = true;
if( unknownSpell )
NemesisPStrCpy( spellName[spellType][spellLevel][spell], tempStr );
else
{
if( theSpellName[0] <= 0 )
NemesisPStrCpy( tempStr, "\p«No name»" );
else
NemesisPStrCpy( tempStr, theSpellName );
NemesisPStrCpy( spellName[spellType][spellLevel][spell], tempStr );
}
}
void CMGlobal::SpellName( int spellType, int spellLevel, int spell, Str255 theSpellName )
{
Str255 tempStr;
NemesisPStrCpy( theSpellName, "\p«Error returned from CMGlobal::SpellName»" );
// Error checking
if( (spellType < kClericSpellList) || (spellType > kEnchanterSpellList) )
return;
if( (spellLevel < 0) || (spellLevel > 6) )
return;
if( (spell < 0) || (spell > 11) )
return;
if( spellName[spellType][spellLevel][spell][0] <= 0 )
return;
NemesisPStrCpy( theSpellName, spellName[spellType][spellLevel][spell] );
}
void CMGlobal::SetSpellDescription( int spellType, int spellLevel, int spell, Str255 theSpellDesc )
{
Str255 tempStr;
Boolean unknownSpell = false;
NemesisPStrCpy( tempStr, "\p«Error passing to CMGlobal::SetSpellDescription»" );
// Error checking
if( (spellType < kClericSpellList) || (spellType > kEnchanterSpellList) )
unknownSpell = true;
if( (spellLevel < 0) || (spellLevel > 6) )
unknownSpell = true;
if( (spell < 0) || (spell > 11) )
unknownSpell = true;
if( unknownSpell )
NemesisPStrCpy( spellDescription[spellType][spellLevel][spell], tempStr );
else
{
if( theSpellDesc[0] <= 0 )
NemesisPStrCpy( tempStr, "\p«No description»" );
else
NemesisPStrCpy( tempStr, theSpellDesc );
NemesisPStrCpy( spellDescription[spellType][spellLevel][spell], tempStr );
}
}
void CMGlobal::SpellDescription( int spellType, int spellLevel, int spell, Str255 theSpellDesc )
{
Str255 tempStr;
NemesisPStrCpy( theSpellDesc, "\p«Error returned from CMGlobal::SpellDescription»" );
// Error checking
if( (spellType < kClericSpellList) || (spellType > kEnchanterSpellList) )
return;
if( (spellLevel < 0) || (spellLevel > 6) )
return;
if( (spell < 0) || (spell > 11) )
return;
if( spellDescription[spellType][spellLevel][spell][0] <= 0 )
return;
NemesisPStrCpy( theSpellDesc, spellDescription[spellType][spellLevel][spell] );
}
OSErr CMGlobal::WritePrefs( FSSpec & prefSpec, preferences & thePrefs )
{
OSErr error = noErr;
Handle buffer;
FSSpec theTempFileSpec;
SetCursor( &G->WatchCursor() );
// If the file does not exist, create it
if( !NemesisDoesFileExist( prefSpec ) )
{
error = FSpCreate( &prefSpec, G->Creator(), CMData()->PrefsType(), smSystemScript);
if( error ) return error;
}
error = NemesisCreateTempFile( prefSpec, theTempFileSpec, G->Creator(), G->TempType() );
if( error ) return error;
error = NemesisAllocateHandle( sizeof(preferences), &buffer );
if( error )
{
SetCursor( &G->ArrowCursor() );
if( buffer ) NemesisDisposeHandle( &buffer );
return error;
}
NemesisLockHandle( buffer );
(preferencesPtr)*buffer = &thePrefs;
error = NemesisWriteData( theTempFileSpec, 0, sizeof(preferences), buffer );
if( error )
{
SetCursor( &G->ArrowCursor() );
NemesisDisposeHandle( &buffer );
return error;
}
NemesisDisposeHandle( &buffer );
error = NemesisDeleteTempFile( theTempFileSpec, prefSpec );
if( error ) return error;
error = FlushVol( nil, prefSpec.vRefNum );
SetCursor( &G->ArrowCursor() );
return error;
}
OSErr CMGlobal::SavePrefs()
{
OSErr error = noErr;
// Not an error but we don't want to write prefs if we don't know
// where Realmz is.
if( !knowWhereRealmzIs )
return error;
preferences thePrefs;
FSSpec prefSpec;
short VRefNum;
long dirID;
error = FindFolder( kOnSystemDisk, kPreferencesFolderType, kCreateFolder,
&VRefNum, &dirID);
if( error ) return error;
error = FSMakeFSSpec( VRefNum, dirID, prefsName, &prefSpec);
// Check for fnfErr and ignore it 'cos we are about to create the prefs.
if( error == fnfErr ) error = noErr;
if( error ) return kPrefsWriteError;
// Setup the prefs structure with relevant info.
thePrefs.version = kPrefsVersion;
thePrefs.lastRealmzLocation = realmzLocation;
error = WritePrefs( prefSpec, thePrefs );
if( error ) return kPrefsWriteError;
return error;
}
OSErr CMGlobal::ReadPrefs( FSSpec & prefSpec, preferences & thePrefs )
{
OSErr error = noErr;
long prefsSize = sizeof( preferences );
Handle buffer;
if( !NemesisDoesFileExist( prefSpec ) )
return fnfErr;
SetCursor( &G->WatchCursor() );
error = NemesisAllocateHandle( prefsSize, &buffer );
if( error )
{
SetCursor( &G->ArrowCursor() );
if( buffer ) NemesisDisposeHandle( &buffer );
return error;
}
NemesisLockHandle( buffer );
error = NemesisReadData( prefSpec, 0, prefsSize, buffer );
if( error )
{
SetCursor( &G->ArrowCursor() );
NemesisDisposeHandle( &buffer );
return error;
}
thePrefs = (preferences &)**buffer;
NemesisDisposeHandle( &buffer );
SetCursor( &G->ArrowCursor() );
return error;
}
OSErr CMGlobal::DeletePrefs( FSSpec & prefSpec )
{
return FSpDelete( &prefSpec );
}
OSErr CMGlobal::LoadPrefs()
{
preferences thePrefs;
OSErr error = noErr;
FSSpec prefSpec;
short VRefNum;
long dirID;
error = FindFolder( kOnSystemDisk, kPreferencesFolderType, kCreateFolder,
&VRefNum, &dirID);
if( error ) return error;
error = FSMakeFSSpec( VRefNum, dirID, prefsName, &prefSpec);
if( error )
{
knowWhereRealmzIs = false;
return error;
}
// Attempt to read the prefs
error = ReadPrefs( prefSpec, thePrefs );
// Don't want to alert if file does not exist. It will just be created on exit.
if( error == fnfErr )
{
knowWhereRealmzIs = false;
return noErr;
}
if( error )
{
// If an unexpected EOF was reached, delete the prefs because they are probably damaged.
if( error == eofErr )
DeletePrefs( prefSpec );
knowWhereRealmzIs = false;
return kPrefsReadError;
}
// Check its the correct prefs version
if( thePrefs.version != kPrefsVersion )
{
DeletePrefs( prefSpec );
knowWhereRealmzIs = false;
return kPrefsReadError;
}
// Check file still exists
if( !NemesisDoesFileExist( thePrefs.lastRealmzLocation ) )
{
DeletePrefs( prefSpec );
knowWhereRealmzIs = false;
return error;
}
// Check the file is realmz, not just another file with that name
if( !IsFileRealmz( thePrefs.lastRealmzLocation ) )
{
DeletePrefs( prefSpec );
knowWhereRealmzIs = false;
return error;
}
// Assume everything went OK
knowWhereRealmzIs = true;
realmzLocation = thePrefs.lastRealmzLocation;
return error;
}
void main()
{
OSErr error = noErr;
long temp;
G = new nemesisGlobal( error );
if( (error) || (G == nil) )
{
SysBeep( 30 );
Delay( 30, &temp );
ExitToShell();
}
NemesisEventLoop();
}